﻿using System;
using System.Collections.Generic;
using System.Linq;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Interfaces.Repositories;

namespace GigaSite.Domain.DAL.Repositories
{
    /// <summary>
    /// СУБД репозиторий услуг
    /// </summary>
    public class ServicesRepository: BaseRepository<Service>, IServicesRepository
    {
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="dataContext">Контекст доступа к данным</param>
        public ServicesRepository(GigaDataContext dataContext) : base(dataContext)
        {
        }

        /// <summary>
        /// Загружает указанную сущность по ее идентификатору
        /// </summary>
        /// <param name="id">Идентификатор сущности</param>
        /// <returns>Сущность с указанным идентификатором или Null</returns>
        public override Service Load(long id)
        {
            return Find(s => s.Id == id);
        }

        /// <summary>
        /// Получает услуга, находящиеся в указанной категории
        /// </summary>
        /// <param name="category">Категория</param>
        /// <returns>Коллекция услуг</returns>
        public IEnumerable<Service> GetServicesInCategory(Category category)
        {
            return category.ServiceToCategoryMappings.Select(mapping => mapping.Service);
        }

        /// <summary>
        /// Устанавливает категории, к которым относится услуга
        /// </summary>
        /// <param name="service">Услуга</param>
        /// <param name="categories">Категории</param>
        public void SetServiceCategories(Service service, IEnumerable<Category> categories)
        {
            // Ищем категории связь с которыми нужно удалить
            var categoriesToDelete = service.ServiceToCategoryMappings.Where(m => !categories.Any(category => category.Id == m.CategoryId));

            // Ищем категории связь с которыми нужно добавить
            var categoriesToAdd = categories.Where(category => !service.ServiceToCategoryMappings.Any(mapping => mapping.CategoryId == category.Id));

            // Выполняем действия
            DataContext.ServiceToCategoryMappings.DeleteAllOnSubmit(categoriesToDelete);
            DataContext.ServiceToCategoryMappings.InsertAllOnSubmit(categoriesToAdd.Select(category => new ServiceToCategoryMapping()
            {
                Service = service,
                Category = category,
                DateCreated = DateTime.Now
            }));

            // Сохраняем изменения в БД
            SubmitChanges();
        }
    }
}